from selenium import webdriver #用于创建浏览器驱动对象，控制浏览器，需要先DOS命令安装：python -m pip install selenium
from selenium.webdriver.common.by import By#法
import time

#########################################################################################################################
# 创建谷歌浏览器对象
Driver = webdriver.Chrome()
Driver.maximize_window()# 窗口最大化
#Driver.minimize_window()#窗口最小化
#Driver.set_window_size(width,height)#指定窗口尺寸
# 打开百度网址
Driver.get("http://www.baidu.com")
#########################################################################################################################
##################################
#通过ID定位
Driver.find_element(By.ID, "kw").send_keys("java")#send_keys是输入文本
#通过NAME定位
Driver.find_element(By.NAME, "tj_briicon").click()#click点击
#同样的含有CLASS_NAME,TAG_NAME
##################################
#LINK定位(针对超链接)
Driver.find_element(By.LINK_TEXT,"新闻").click()
Driver.find_element(By.PARTIAL_LINK_TEXT,"闻").text#获取文本
##################################
#通过CSS选择器定位
#<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" auto="off" placeholder="哈马斯">
Driver.find_element(By.CSS_SELECTOR,"#kw")#ID用#
Driver.find_element(By.CSS_SELECTOR,".s_ipt")#CLASS用.
Driver.find_element(By.CSS_SELECTOR,"input")#直接用标签名
Driver.find_element(By.CSS_SELECTOR,"input[auto='off']")#用标签+属性
Driver.find_element(By.CSS_SELECTOR,"⽗标签[⽗标签属性名=⽗标签属性值]>（或者空格）⼦标签")#层级定位
Driver.find_element(By.CSS_SELECTOR,"input[auto='off']")
##################################
#通过xpath定位
#【/绝对从根开始】【//相对任意位置】【.选取当前节点】【..选取父节点】【@选取属性】
Driver.find_element(By.XPATH,"/html/body/div/div/div/input")
Driver.find_element(By.XPATH,"//input[@id='input']")#通过自身ID
Driver.find_element(By.XPATH,"//div[@id='operate_zn']/div/div/input")#通过上级ID
Driver.find_element(By.XPATH,f'//ul[@class="el"]/li/span[text()="{0}"]')#变量引入+推荐定位方式，//全局找ul，span内文本为0的
#如果属性的部分值是变化的如：id=‘search-3306’
Driver.find_element(By.XPATH,"//input[contains(@id,'search')]")#contains可模糊匹配
Driver.find_element(By.XPATH,"//input[starts-with(@id,'search')]")#字符串开头匹配
Driver.find_element(By.XPATH,"//input[ends-with(@id,'search11')]")#字符串结尾匹配
Driver.find_element(By.XPATH,"//input[@id='search' and @class='e_sn']")#逻辑，or，not
#########################################################################################################################
time.sleep(3)
#隐式等待
#                 若元素没找到，每0.5s找一次，最多找3秒之后报错,默认0.5
Driver.implicitly_wait(3,0.5)#一次设置，全局有效

#显式等待
#只是等待该定位点是否出现，之后还是正常写点击或输入操作，建议封装使用
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(Driver,10,5).until(EC.presence_of_element_located((By.XPATH,'//*[@id="su"]')))
#             对象       最长等待时间     轮询间隔
WebDriverWait(Driver, 10).until(EC.frame_to_be_available_and_switch_to_it( (By.NAME, "navlframe2")))#等待并切换进iframe内页面
#########################################################################################################################
#关闭标签页
Driver.close()
#退出浏览器
Driver.quit()
#########################################################################################################################
#杂项：
input = Driver.find_element(By.ID, "kw").send_keys("java")
input.clear()#删除文本框输入的java
title=Driver.title#获取页面标题
source_code=Driver.page_source#获取页面源码
url=Driver.current_url#获取页面链接
Driver.back()   #页面后退一页
Driver.forward()#页面前进一页
Driver.refresh()#页面刷新
################################
#关于窗口切换：
cwd = Driver.current_window_handle#获取当前窗口的句柄
cwds = Driver.window_handles      #获取所有打开窗口的句柄
cwdss = Driver.window_handles[0]  #0代表主窗口，-1即倒数第一位为最后打开的窗口
Driver.switch_to.window(cwd)      #切换到该句柄页面
#页面中页面的情况：
Driver.switch_to.frame('''定位''')#切入定位内页
Driver.switch_to.parent_frame()#切回上一级
Driver.switch_to.default_content()#切回最顶层
################################
#关于鼠标操作：
from selenium.webdriver import ActionChains#通过act类来操作鼠标
action = ActionChains(Driver)
action.move_to_element('''定位''').perform()#鼠标悬停到该定位
action.double_click()#双击
action.context_click()#右击
#关于键盘操作：
#定位.send_keys(Keys.键位)
#################################
#浏览器截屏
Driver.save_screenshot("a.png")#两种截图方式，括号内未保存地址，
Driver.get_screenshot_as_file('a.png')#只写⽂件名保存⾄当前路径
#################################
#获取标签属性值
#属性值 = 定位后.get_attribute('属性名')
#################################
#关于下拉列表的选中：
#select = Select(‘定位’)判断标签元素XX是否为下拉列表元素，是返回Select对象，不是报错
#select.select_by_value(’value属性的值‘)
#select.select_by_visible_text('文本内容')
#select.select_by_index(‘索引’)
#################################
#关于弹窗：
alert = Driver.switch_to.alert#获取弹窗对象
a=alert.text#获取弹窗内容
alert.accept()#确认弹窗
alert.dismiss()#取消弹窗
#################################
#滑块操作：
# from selenium.webdriver import ActionChains
#
# a=driver.find_element(By.XPATH,'')#定位滑块
# ActionChains(driver).click_and_hold(a).perform()  # 按住滑块
# ActionChains(driver).move_by_offset(xoffset=300, yoffset=0).perform()  # 按照计算的距离移动滑块
# time.sleep(2)  # 等待2秒
# ActionChains(driver).release().perform()  # 释放滑块
# time.sleep(2)

#########################################################################################################################